'''
@since: 21.03.2014

@author: Max
@version: 0.0.1

@summary: Das ist das Kernstueck des Spiels. Von hier wird die Engine verwaltet.
'''

import os

from ErrorCodes import *    # @UnusedWildImport
from Messages import *    # @UnusedWildImport
from Properties import *    # @UnusedWildImport
from core.content.Map import *    # @UnusedWildImport
from core.engine.InputSystem import *    # @UnusedWildImport
from gfx.Hud import *    # @UnusedWildImport


class GameLogic(object):
    def __init__(self):
        """
        Constructor fuer die GameLogic
        
        Zunaechst nur Deklaration von einigen Klassenvariablen (screen, clock, bRunning)
        """
        
        self.screen = None 
        """ @ivar: Das Fenster, in welchem alles gezeichnet wird. """
        
        self.clock = None 
        """ @ivar: Ein Timer fuer Zeitrechnungen. """
        
        self.bRunning = True 
        """ @ivar: Bool-Variable, welche die Mainloop steuert. """
        
        self.map = None
        """ @ivar: Laed die komplette Map, inklusive der Leinwand, auf der sie gezeichnet ist"""
        
        self.inputsystem = None
        """ @ivar: Im InputSystem werden alle Eingaben abgefangen und weiter verarbeitet """
    
    def startGame(self):
        """
        Diese Funktion startet die Engine und erstellt ein Fenster mit voreingestellten Optionen
        
        @todo: Tilemap-Loader muss noch implementiert werden
        """
        os.environ['SDL_VIDEO_CENTERED'] = str(GAMELOGIC_SCREEN_CENTERED)
        pygame.init()
        
        if(GAMELOGIC_SCREEN_FULLSCREEN):
            fs = pygame.FULLSCREEN
        else:
            fs = 0
        self.screen = pygame.display.set_mode([GAMELOGIC_SCREEN_WIDTH, GAMELOGIC_SCREEN_HEIGHT], fs)
        
        pygame.display.set_caption(GAMELOGIC_SCREEN_TITLE)
        
        pygame.mouse.set_visible(GAMELOGIC_MOUSE_SHOW)
        pygame.key.set_repeat(GAMELOGIC_KEY_DELAY, GAMELOGIC_KEY_INTERVAL)
        
        self.clock = pygame.time.Clock()
        
        self.map = Map(RESOURCES_MAP_TILESET, self.clock)
        self.map.loadMap()
       
        self.hud = Hud()
       
        
        self.inputsystem = InputSystem(self, self.map, self.hud)
        
        self.runMainloop()

           
    def runMainloop(self):
        """
        Diese Funktion startet die Mainloop des Spiels
        """
        while self.bRunning:
            self.clock.tick(GAMELOGIC_FPS_MAX)

            self.updateGame()
            self.renderGame()
            
    def updateGame(self):
        """
        Diese Funktion ruft alle fuer jede Klasse, die Update-Methode auf, in welcher alle Berechnungen geschehen
        """
        self.inputsystem.update(pygame.event.get())
        self.map.update()
        self.hud.update()
        
        
    def renderGame(self):
        """
        Diese Funktion ruft alle Klassen, die Render-Methoden besitzen diese auch auf
        """
        pygame.display.set_caption(GAMELOGIC_SCREEN_TITLE + " @ %.2f FPS" % (self.clock.get_fps()))
        self.screen.fill(COLOR_BLACK)
        
        self.map.render(self)
        self.hud.render(self)
        
        pygame.display.update()     
           
    def endGame(self, errorCode):
        """
        Setzt die boolean bRunning auf False und endet somit die Mainloop. Danach gibt sie noch einen Return-Code aus
        @param errorCode: String-Repraesentation eines Error-Codes (wird aus ErrorCodes.py gelesen)
        """
        self.bRunning = False  
        print(GAME_EXIT + errorCode)

                
 
            
    
            
            
        
